<?php
// +----------------------------------------------------------------------
// | Options服务服务层
// +----------------------------------------------------------------------
// | 主要服务于Options数据处理
// +----------------------------------------------------------------------
// | 错误编码头 214xxx
// +----------------------------------------------------------------------
namespace common\service;

use common\model\OptionsModel;
use Exception;
use support\SingletonTrait;
use support\ErrorCode;
use think\Cache;

class OptionsService
{
    // 单例模式工具
    use SingletonTrait;

    /**
     * 获取指定Options设置
     * @param $optionName
     * @return mixed
     * @throws \think\Exception
     */
    public function getOptionsData($optionName)
    {
        $resData = model(OptionsModel::class)->field("config")->where(['name' => $optionName])->cache('option_query_cache:' . $optionName, C('database.default_query_cache_time'))->find();
        if (!empty($resData)) {
            CommonService::instance('options')->getFormatAttrData($resData);
        } else {
            return $resData;
        }
        return array_key_exists("config", $resData) ? $resData['config'] : [];
    }

    /**
     * 清除查询配置缓存
     * @param $optionNames
     * @return void
     */
    public function clearOptionCache($optionNames = [])
    {
        foreach ($optionNames as $optionName) {
            Cache::rm('option_query_cache:' . $optionName);
        }
    }

    /**
     * 获取指定Options设置项值
     * @param $optionName
     * @param $itemName
     * @param string $default
     * @return string
     */
    public function getOptionsConfigItemData($optionName, $itemName, $default = '')
    {
        $configData = $this->getOptionsData($optionName);
        if (!empty($configData) && array_key_exists($itemName, $configData)) {
            return $configData["$itemName"];
        } else {
            return $default;
        }
    }

    /**
     * 通用更新修改Options
     * @param $params
     * @param string $message
     * @return array
     */
    public function updateOptionsData($params, $message = '')
    {
        $optionsModel = model(OptionsModel::class);
        $updateOptionResult = $optionsModel->updateOptionsData($params);
        if ($updateOptionResult) {
            if (empty($message)) {
                $message = 'Modify options success';
            }
            // 返回成功数据
            return success_response($message, $updateOptionResult);
        } else {
            // 添加更新系统配置失败错误码 001
            throw_strack_exception($optionsModel->getError(), ErrorCode::SYSTEM_CONFIG_UPDATE_FAILED);
        }
    }

    /**
     * 通用添加配置
     * @param $params
     * @param string $message
     * @return array
     * @throws Exception
     */
    public function addOptionsData($params, $message = '')
    {
        $optionsModel = model(OptionsModel::class);
        $findOptionsResult = $optionsModel->findData(["filter" => ["name" => $params['options_name']]]);
        if (empty($findOptionsResult)) {
            $addOptionsResult = $optionsModel->updateOptionsData($params);
            if ($addOptionsResult) {
                if (empty($message)) {
                    $message = $optionsModel->getSuccessMessage();
                }
                // 返回成功数据
                return success_response($message, $addOptionsResult);
            }

        } else {
            return $this->updateOptionsData($params);
        }
    }
}
